#include <iostream>
#include <vector>
using namespace std;

int main() {
    int W = 0;
    int H = 0;
    cin >> W >> H;

    // 下面是我自己的思路
    // 因为题目要求两个放蛋糕的格子的距离不能等于2
    // 那么可以得知一个格子的左边第二个，右边第二个，上边第二个，下边第二个不能有蛋糕
    // 所以我先把网格都初始化为0，然后每个格子进行判断，如果满足上面的条件，我就把该格子赋值为1
    // 遍历整个网格
    vector<vector<int>> vv(H, vector<int>(W, 0));

    int count = 0;

    for (int i = 0; i < H; i++) 
    {
        for (int j = 0; j < W; j++) 
        {
            int flag1 = 0;
            int flag2 = 0;
            int flag3 = 0;
            int flag4 = 0;

            if(i + 2 < H)
            {
                if(vv[i + 2][j] == 0)
                {
                    flag1 = 1;
                }
            }
            else 
            {
                flag1 = 1;
            }

            if(j + 2 < W)
            {
                if(vv[i][j + 2] == 0)
                {
                    flag2 = 1;
                }
            }
            else 
            {
                flag2 = 1;
            }

            if(i - 2 >= 0)
            {
                if(vv[i - 2][j] == 0)
                {
                    flag3 = 1;
                }
            }
            else 
            {
                flag3 = 1;
            }

            if(j - 2 >= 0)
            {
                if(vv[i][j - 2] == 0)
                {
                    flag4 = 1;
                }
            }
            else 
            {
                flag4 = 1;
            }

            if(flag1 && flag2 && flag3 && flag4)
            {
                vv[i][j] = 1;
                count++;
            }
        }
    }

    cout << count << endl;
    return 0;
}
